#include "dboperation.h"
#include <QSqlError>
#include <QSqlQuery>
#include <QDebug>

DBOperation::DBOperation(QObject *parent) : QObject(parent)
{
    // 如果数据库实例已经存在了, 什么也不做, 如果实例不存在就添加一个实例
    if(!QSqlDatabase::contains())
    {
        m_db = QSqlDatabase::addDatabase("QOCI");
        qDebug() << "数据库实例添加成功...";
    }
    qDebug() << "do nothing...";
}

bool DBOperation::connectDB(QString user, QString passwd, QString host, unsigned short port, QString dbName)
{
    bool flag = true;
    if(!m_db.isOpen())
    {
        // 进行连接的初始化
        m_db.setUserName(user);
        m_db.setPassword(passwd);
        m_db.setHostName(host);
        m_db.setPort(port);
        m_db.setDatabaseName(dbName);
        // 连接数据库
        flag = m_db.open();
        if(!flag)
        {
            qDebug() << "数据库打开失败的原因: " << m_db.lastError().text();
        }
        else
        {
            qDebug() << "数据库打开成功...";
        }
    }
    return flag;
}

void DBOperation::disConnectDB()
{
    m_db.close();
}

bool DBOperation::userAuthentication(QString id, QString passwd)
{
    // 查询的网点信息表 -> secnode
    QString sql = QString("select * from secnode where id = '%1' and password = '%2'")
            .arg(id).arg(passwd);
    QSqlQuery query;
    // 执行sql
    query.exec(sql);
    // 判断结果集中有没有记录, 如果有也是只有一条
    if(query.next())
    {
        return true;
    }
    return false;
}

bool DBOperation::isValideClient(QString id)
{
    // 查询的网点信息表 -> secnode
    QString sql = QString("select * from secnode where id = '%1' and state = 1").arg(id);
    QSqlQuery query;
    // 执行sql
    query.exec(sql);
    // 判断结果集中有没有记录, 如果有也是只有一条
    if(query.next())
    {
        return true;
    }
    return false;

}


bool DBOperation::insertSeckeyInfo(SeckeyInfo &keyinfo)
{
    // 插入秘钥到秘钥信息表 -> seckeyinfo
    QString sql = QString("insert into seckeyinfo values('%1', '%2', %3, sysdate, %4, '%5')")
            .arg(keyinfo.clientID).arg(keyinfo.serverID)
            .arg(keyinfo.seckeyID).arg(keyinfo.status).arg(keyinfo.seckey);
    // 执行sql语句
    QSqlQuery query;
    // 开启一个事务
    m_db.transaction();
    bool bl = query.exec(sql);
    if(bl)
    {
        // 更新keysn表中的ikeysn字段的值
        sql = QString("update keysn set ikeysn=%1").arg(keyinfo.seckeyID+1);
        bool flag = query.exec(sql);
        if(flag)
        {
            // 所有的操作都成功了, 提交数据
            m_db.commit();
            return true;
        }
    }
    m_db.rollback();
    return false;
}

int DBOperation::getKeyID()
{
    int keyid = -1;
    QSqlQuery query("select ikeysn from keysn");
    query.exec();
    if(query.next())
    {
        keyid = query.value(0).toInt();
    }
    return keyid;
}

bool DBOperation::modifyKeyStatus(bool status, int keyID)
{
    // 操作的数据库表 -> 秘钥信息表 -> seckeyinfo
    QString sql = QString("update seckeyinfo set state=%1 where keyid=%2")
            .arg(status).arg(keyID);
    QSqlQuery query;
    // 开启事务
    m_db.transaction();
    bool flag = query.exec(sql);
    if(flag)
    {
        m_db.commit();
    }
    else
    {
        m_db.rollback();
    }
    return flag;
}
